function foo() {
  // 注意，由于闭包，name不会被销毁，同样可以对这个值进行访问
  var name = "foo"
  function bar() {
    console.log("bar", name)
  }

  return bar
}

var fn = foo()
fn()

/**
 * 理解：
 * 全局环境内容：foo、fn
 * foo环境内容：name、bar
 * bar环境内容：啥也没有
 * 闭包调用就是全局当中，访问bar，而bar有访问上级的作用域变量，此时name就不会被销毁，形成闭包
 * 这个步骤是在词法解析的时候决定name会不会被销毁的
 * 解释：
 * 一个函数和对其周围状态的引用捆绑在一起，这样的组合就是闭包
 */
var age = 12+
function getAge() {
  console.log(age)
}
// 这就是一个闭包